Bitmap Header Turorial

Погледнете първо следните пикове :))

Хубави са нали :) Нека сега разучим тяхната структура.Погледнете пиковете още един път , че тази структура не е  много лесна ;) Като за начало предполагам ви е направило впечатление , че те са с разширение .bmp т.е те са Bitmap-и . Нека сега ги отворим с някои HEX-Editor 

Преди всички имайте в предвит слдната структура

offset

size 

description
0 2 трябва да бъде винаги 4D42 (в hex)
2 4 Размера на BitMap-а в байтове(не винаги)
6 2 Трябва да е 0(константа)
8 2 Трябва да е 0(константа)
10 4 Офсета където започва 'image data'(началото на на Декодирането на информацията)
14 4 Размера на BITMAPINFOHEADER структурата(трябва да е 28)
18 4 Дължината на образа в пиксели
22 4 Височината на образа в пиксели
26 2 Номера на плана на изображението(трябва да е 1)
28 2 Брой битове за пиксел (1,4,8,16 или 24)
30 4 Вид компресия(0=никаква, 1=RLE-8, 2=RLE-4)
34 4 Размера на 'image data' 
38 4 Хоризонтална резолюция в пиксели на см.
42 4 Вертикална резолюция в пиксели на см.
46 4 Броя на цветовете в изображението или направо 0
50 4 Броя на важните цветове или направо 0

Нека сега да започнем с анализа на снимката.Първите 2 байта са ясни(424D=BM),защото са задължителни.Следващите 4 са за размера , но те никога не се взимат под внимание и в повечето случеи са случайни числа , така че няма смисъл да ги анализираме.После на офсет 6 и 8 имаме пак по 2 байта които винаги трябва да са нули и са константи.После на офсет 10 е записан адреса за началото на 'image data'.image data е тази част на битмапа , която се превръща от HEX в отделни пиксели.В случея писше.това означава че от този офсет(36) всеки символ се преобразува в някакъв цвят.След това на офсет 14 имаме 4 байта които са константни(28).Следващите 4 байта от  офсет 18 и ни показват колко пиксела е дължината на образа(B4 в decimal е 180).Следващите 4 байта ни показват колко пиксела е височината на образа(2C01 в decimal е 11265).Стигнахме до офсет 26 и 27.Те показват плана на изображението , но в повечето случеи се приемат за константи т.е. просто 0100h.Един от най важните (поне според мене) е офсет 28.От него се взема колко байта да отговарят на един пиксел.Или казано иначе колкото по малко байтове се използват за един пиксел , толкова по малко са съответно съзможните цветове.Възможностите са 1,4,8,16 или 24 бита за пиксел в цветове ще рече съответно:

Бита за пиксел Брой цветове
1 2 цвята
2 4 цвята
4 16 цвята
8 (байт) 256 цвята
16(2 байта) 65536 цвята
24(3 байта) 16777216 цвята

В случея на нашия пик всеки пиксел е по 2 байта.Затова и пика е толкова реалистичен.Байтовете от офсет 30 до офсет 34 са предвидени за комресия на битмапа , но до до сега не съм виждал програма която да използва или подържа тази комресия,затова се мриема , че те са константи (00000000)
Байтовете от офсет 34 до офсет 38 са предвидени за размера на 'image data' или казани иначе докъде ще бъде преобразуването от HEX в нормални цветове.Колкото им е SignedLong-а на тези 4 байта , толкова ще бъдат трансформираните байтове в цветове.В случея имаме D0780200 и това ще е равно на 162000 =>от 'image data' ще бъдат прочетени 162000 бита.След това на офсет 38 идват 4 байта които показват каква ще бъде хоризонталната резолюция в пиксели на сантиметар.След тях има още 4 байта които ни показват вертикалната резолюция в пиксели на сантиметар.Байтовете от офсет 46 до офсет 50 са предвидени за броя на  цветовете в изображението, но почти винаги се слага това не се използва по предназначение и се поставя направо 00000000.Следващите 4 байта са предназначени за по важните цветове в изображението , но пак това се пренебрегва и повечето програми слагат 00000000.